#include <gl/glew.h>
#include <gl/freeglut.h>
#include <IL/il.h>
#include <iostream>
#include <string>

#include "Game.h"
#include "Textura.h"


using namespace std;

Textura::Textura(string & ruta, bool alpha):Recurso(ruta)
{
	this->alpha = alpha;
	anchoReal = altoReal = 0;
	cargar(ruta);
}
void Textura::cargar(string & ruta){

	
	ilGenImages(1,&ilID);
	ilBindImage(ilID);

	if ( ilLoadImage((const ILstring) ruta.c_str() )){	
		ilConvertImage(alpha ? IL_RGBA : IL_RGB, IL_UNSIGNED_BYTE);
		glGenTextures(1,&idTextura);
		glBindTexture(GL_TEXTURE_2D, idTextura);

	
		this->ancho = anchoReal = ilGetInteger(IL_IMAGE_WIDTH);
		this->alto	= altoReal	= ilGetInteger(IL_IMAGE_HEIGHT);

		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

		if(glewIsSupported("GL_ARB_texture_non_power_of_two"))
			glTexImage2D(GL_TEXTURE_2D, 0, ilGetInteger(IL_IMAGE_BPP), ilGetInteger(IL_IMAGE_WIDTH),//Cargamos la textura en opengl con los datos de la textura cargada.
			ilGetInteger(IL_IMAGE_HEIGHT), 0, ilGetInteger(IL_IMAGE_FORMAT), GL_UNSIGNED_BYTE,
			ilGetData()); 
		else{

			anchoReal	= getNextPowOfTwo(ilGetInteger(IL_IMAGE_WIDTH));
			altoReal	= getNextPowOfTwo(ilGetInteger(IL_IMAGE_HEIGHT));

			glTexImage2D(GL_TEXTURE_2D, 0, ilGetInteger(IL_IMAGE_BPP), anchoReal,
				altoReal, 0, ilGetInteger(IL_IMAGE_FORMAT), GL_UNSIGNED_BYTE,
				NULL); 
			glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0,ilGetInteger(IL_IMAGE_WIDTH),ilGetInteger(IL_IMAGE_HEIGHT),
				ilGetInteger(IL_IMAGE_FORMAT),GL_UNSIGNED_BYTE,ilGetData());
			//g->alertaError(string("Texturas con potencia != n2 no soportadas"));
		}
	

	}else{
		g->getLog()->add_tag("Textura","Fallo al cargar textura");	
		g->alertaError("La textura " + ruta + " no ha sido encontrada.");
	}
		
}
void Textura::bind(void){
	glBindTexture(GL_TEXTURE_2D,idTextura);
}

int Textura::getNextPowOfTwo(int n){
	int potencia = 2;

	while (potencia<n)
		potencia *=2;
	return potencia;
}
Textura::~Textura(void)
{
	glDeleteTextures(1,&idTextura);
	ilDeleteImages(1, &ilID);

}
